package utils;

import entity.News;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * Created by 梅晨 on 2017/7/20.
 */
public class Transform {

    /**
     * 将新闻中的每个词的vec加权，得到整篇新闻的vec，每个List<Float>代表一个vec
     * @param wordVecs 新闻中词的词向量集合
     * @return 新闻的vec表示
     */
    public static List<Float> getParaVec(List<List<Float>> wordVecs){
		if(wordVecs.size() == 0) return new ArrayList<Float>();
    	List<Float> newsVecs = new ArrayList<Float>();
    	int wordVecsSize = wordVecs.size();
    	int newsVecsSize = wordVecs.get(0).size();
    	
    	for(int i = 0; i < newsVecsSize; i++) {
    		float vec = 0;
    		for(int j = 0; j < wordVecsSize; j++) {
    			vec = vec + wordVecs.get(j).get(i);
    		}
    		vec = (Float)(vec / wordVecsSize);
    		newsVecs.add(vec);
    	}
    	
        return newsVecs;
    }

    /**
     * 提取news对象中的向量表示，将向量转换成libsvm格式
     * @param newsList 新闻集合list
     * @return 表示新闻的vec转换成libsvm格式的集合
     */
    public static List<String> trans2lisvm(List<News> newsList){
		if(newsList.size() == 0) return new ArrayList<String>();
    	List<String> libsvm = new ArrayList<String>();
    	
    	for(News news : newsList) {
    		int emotionIndex = news.getEmotionIndex();
    		StringBuffer libsvmString = new StringBuffer();
    		libsvmString.append(emotionIndex + ":");
    		
    		List<Float> vec = news.getVec();
    		for(int i = 0; i < vec.size(); i++) {
    			float vecElement = vec.get(i);
    			libsvmString.append(" " + i + ":" + vecElement);
    		}
    		
    		libsvm.add(libsvmString.toString());
    	}

        return libsvm;
    }

    /**
     * 将训练数据划分成两块，一块用来训练模型，一块用来测试结果，比例可选（9:1或者8:2）
     * @param map 训练数据地址
     * @return 返回一个list列表，列表有两项，第一项存训练数据，第二项存测试数据
     */
    public static List<HashMap<String,Integer>> splitData(HashMap<String,Integer> map){
    	List<HashMap<String,Integer>> map2 = new ArrayList<HashMap<String,Integer>>();
    	HashMap<String,Integer> trainMap = new HashMap<String, Integer>();
    	HashMap<String,Integer> testMap = new HashMap<String, Integer>();
	
        Iterator<Map.Entry<String, Integer>> iter = map.entrySet().iterator();
        while(iter.hasNext()) {
        	Map.Entry<String, Integer> mapEntry = (Entry<String, Integer>) iter.next();
        	if(Math.random() > 0.9) {
        		testMap.put(mapEntry.getKey(), mapEntry.getValue());
        	}else {
				trainMap.put(mapEntry.getKey(), mapEntry.getValue());
			}
        }
        map2.add(trainMap);
        map2.add(testMap);

        return map2;
    }
}
